iT邦幫忙

2026 iThome 鐵人賽

0
AI Engineering

Java × AI:30天打造智慧健康助理系列 第 23 篇

用 Java 自動產生每日健康文字摘要

  • 分享至 

  • xImage
  •  

Day 23|用 Java 自動產生每日健康文字摘要

昨天我們第一次使用 Java 的 HttpClient 呼叫 OpenAI API,成功建立了第一個 AI 測試端點。

原本只能處理固定資料的 Spring Boot 專案,現在終於可以和生成式 AI 模型溝通了!

不過昨天的 AI 功能還有一個問題。

我們只是讓 AI 回答:

請用一句繁體中文介紹智慧健康助理。

雖然可以確認 API 串接成功,但好像還沒有真正發揮智慧健康助理的功能 XD

所以今天決定把前面建立的健康紀錄整合進來。

讓 AI 不只是回答固定問題,而是可以根據資料庫中的飲水量和睡眠紀錄,產生每日健康文字摘要。

今天的目標是:

整合 HealthSummaryService 與 AIService,讓 Spring Boot 自動取得健康紀錄、建立 Prompt,並透過 AI API 產生繁體中文摘要。


一、今天要完成什麼功能?

先回顧目前已經完成的 API。

API 功能
POST /health/water 新增飲水紀錄
POST /health/sleep 新增睡眠紀錄
GET /health/summary 查詢每日健康摘要
GET /health/ai/test 測試 AI API 串接

今天準備新增:

GET /health/ai/summary?date=2026-10-17

這個 API 會先查詢指定日期的健康紀錄,再將資料整理成 Prompt,最後交給 AI 產生文字摘要。

假設資料庫中有:

{
  "date": "2026-10-17",
  "water": {
    "totalWater": 1500,
    "unit": "ml",
    "hasRecord": true
  },
  "sleep": {
    "totalHours": 7.5,
    "unit": "hours",
    "hasRecord": true
  }
}

我們希望 AI 產生類似:

今天已記錄 1500 ml 的飲水量,以及 7.5 小時的睡眠時間。
可以持續記錄每天的生活習慣,方便日後觀察變化。

最後透過 JSON 回傳:

{
  "date": "2026-10-17",
  "summary": "今天已記錄 1500 ml 的飲水量,以及 7.5 小時的睡眠時間。可以持續記錄每天的生活習慣,方便日後觀察變化。"
}

這樣就完成我們第一個真正結合健康紀錄的 AI 功能!


二、先整理今天的系統流程

之前的每日健康摘要功能是:

使用者
   ↓
HealthSummaryController
   ↓
HealthSummaryService
   ↓
WaterService + SleepService
   ↓
H2 Database
   ↓
回傳健康摘要 JSON

昨天的 AI 測試功能則是:

使用者
   ↓
AIController
   ↓
AIService
   ↓
OpenAI API
   ↓
回傳 AI 文字

今天要把兩個流程結合起來:

使用者
   ↓
GET /health/ai/summary
   ↓
AIController
   ↓
AIHealthSummaryService
   │
   ├── HealthSummaryService
   │          ↓
   │     查詢健康紀錄
   │
   └── AIService
              ↓
         OpenAI API
              ↓
         產生文字摘要
   ↓
回傳 JSON

這次會新增:

AIHealthSummaryService

讓它負責整合健康資料和 AI 功能。

為什麼不直接把所有程式寫進 AIController?

因為我們前面已經學過:

Controller 主要負責接收請求,Service 才負責處理業務邏輯。

如果直接在 Controller 裡面查資料庫、組 Prompt、呼叫 AI,程式會變得越來越複雜。

所以今天繼續使用分層架構。


三、回顧 Day 20 的 HealthSummaryResponse

在 Day 20,我們已經建立:

HealthSummaryResponse.java

它的主要結構是:

public class HealthSummaryResponse {

    private LocalDate date;
    private WaterSummaryResponse water;
    private SleepSummaryResponse sleep;

    // Constructor 和 Getter
}

其中 WaterSummaryResponse 包含:

private int totalWater;
private String unit;
private boolean hasRecord;

而 SleepSummaryResponse 包含:

private double totalHours;
private String unit;
private boolean hasRecord;

這樣我們就可以透過:

summary.getWater().getTotalWater();

取得飲水量。

也可以透過:

summary.getSleep().getTotalHours();

取得睡眠時數。

不過今天還有兩個欄位非常重要:

summary.getWater().isHasRecord();

以及:

summary.getSleep().isHasRecord();

它們可以告訴我們指定日期是否真的有紀錄。

這對 AI 來說特別重要。


四、為什麼不能直接把 0 傳給 AI?

假設某一天的健康摘要是:

{
  "date": "2026-10-17",
  "water": {
    "totalWater": 0,
    "unit": "ml",
    "hasRecord": false
  },
  "sleep": {
    "totalHours": 7.5,
    "unit": "hours",
    "hasRecord": true
  }
}

如果我們直接建立 Prompt:

今天喝水 0 ml。
今天睡眠 7.5 小時。

AI 可能會誤以為使用者當天完全沒有喝水。

但實際上:

"hasRecord": false

代表的是:

資料庫裡沒有當天的飲水紀錄。

這和實際喝水量為零完全不同。

所以我們應該將資料整理成:

日期:2026-10-17

飲水紀錄:當日尚無紀錄
睡眠紀錄:7.5 小時

並明確告訴 AI:

沒有紀錄不代表實際數值為零。

這樣才能減少 AI 誤解資料的可能性。


五、先建立 AIHealthSummaryResponse DTO

今天我們希望回傳:

{
  "date": "2026-10-17",
  "summary": "今天已記錄 1500 ml 的飲水量,以及 7.5 小時的睡眠時間。"
}

所以先建立新的 DTO:

AIHealthSummaryResponse.java

放在:

dto

Package 裡面。

完整程式如下:

package com.example.healthassistant.dto;

import java.time.LocalDate;

public class AIHealthSummaryResponse {

    private LocalDate date;
    private String summary;

    public AIHealthSummaryResponse(
            LocalDate date,
            String summary) {

        this.date = date;
        this.summary = summary;
    }

    public LocalDate getDate() {
        return date;
    }

    public String getSummary() {
        return summary;
    }
}

這次的 DTO 很簡單。

只有兩個欄位:

欄位 型別 說明
date LocalDate 摘要所屬日期
summary String AI 產生的文字摘要

之後 Spring Boot 就會將 DTO 自動轉換成 JSON。


六、建立 AIHealthSummaryService

接下來進入今天最重要的部分!

在:

service

Package 裡面新增:

AIHealthSummaryService.java

這個 Service 會負責三件事:

  1. 取得每日健康摘要。
  2. 將資料整理成 Prompt。
  3. 呼叫 AIService 產生文字。

先看完整程式:

package com.example.healthassistant.service;

import com.example.healthassistant.dto.AIHealthSummaryResponse;
import com.example.healthassistant.dto.HealthSummaryResponse;
import com.example.healthassistant.dto.WaterSummaryResponse;
import com.example.healthassistant.dto.SleepSummaryResponse;

import org.springframework.stereotype.Service;

import java.time.LocalDate;

@Service
public class AIHealthSummaryService {

    private final HealthSummaryService healthSummaryService;
    private final AIService aiService;

    public AIHealthSummaryService(
            HealthSummaryService healthSummaryService,
            AIService aiService) {

        this.healthSummaryService = healthSummaryService;
        this.aiService = aiService;
    }

    public AIHealthSummaryResponse generateDailySummary(
            LocalDate date) {

        HealthSummaryResponse healthSummary =
                healthSummaryService.getDailySummary(date);

        String prompt = buildPrompt(healthSummary);

        String aiResult = aiService.generateText(prompt);

        return new AIHealthSummaryResponse(
                date,
                aiResult
        );
    }

    private String buildPrompt(
            HealthSummaryResponse summary) {

        WaterSummaryResponse water = summary.getWater();
        SleepSummaryResponse sleep = summary.getSleep();

        String waterText;

        if (water.isHasRecord()) {
            waterText = water.getTotalWater() + " ml";
        } else {
            waterText = "當日尚無紀錄";
        }

        String sleepText;

        if (sleep.isHasRecord()) {
            sleepText = sleep.getTotalHours() + " 小時";
        } else {
            sleepText = "當日尚無紀錄";
        }

        return """
            你是一位智慧健康紀錄整理助手。

            請根據以下健康紀錄,
            產生一段 100 字以內的繁體中文摘要。

            日期:%s
            飲水紀錄:%s
            睡眠紀錄:%s

            請遵守以下規則:

            1. 只能描述提供的健康紀錄。
            2. 不得自行編造不存在的數據。
            3. 沒有紀錄不代表實際數值為零。
            4. 不提供疾病診斷或治療建議。
            5. 不根據單一紀錄判斷使用者是否健康。
            6. 使用自然、友善且簡潔的語氣。
            7. 不要使用 Markdown 標題或條列式清單。
            """.formatted(
                summary.getDate(),
                waterText,
                sleepText
        );
    }
}

這段程式就是今天整個功能的核心。

接下來拆開來看。


七、使用 Service 整合 Service

首先看到:

private final HealthSummaryService healthSummaryService;
private final AIService aiService;

這裡注入了兩個 Service。

第一個:

HealthSummaryService

負責取得資料庫中的健康紀錄。

第二個:

AIService

負責呼叫生成式 AI API。

接著透過建構子注入:

public AIHealthSummaryService(
        HealthSummaryService healthSummaryService,
        AIService aiService) {

    this.healthSummaryService = healthSummaryService;
    this.aiService = aiService;
}

這樣就可以直接使用前面已經完成的功能。

例如:

HealthSummaryResponse healthSummary =
        healthSummaryService.getDailySummary(date);

這行程式會取得指定日期的健康摘要。

接著:

String prompt = buildPrompt(healthSummary);

將資料整理成 Prompt。

最後:

String aiResult = aiService.generateText(prompt);

呼叫昨天建立的 AIService。

整個流程非常清楚:

取得健康紀錄
      ↓
建立 Prompt
      ↓
呼叫 AI
      ↓
取得文字
      ↓
回傳 DTO

八、使用 if 判斷資料是否存在

接下來看看:

private String buildPrompt(
        HealthSummaryResponse summary)

這個 Method。

它的工作是將健康摘要 DTO 轉換成 AI 可以閱讀的文字。

首先取得飲水資料:

WaterSummaryResponse water = summary.getWater();

再判斷是否有紀錄:

if (water.isHasRecord()) {
    waterText = water.getTotalWater() + " ml";
} else {
    waterText = "當日尚無紀錄";
}

如果有紀錄:

1500 ml

如果沒有紀錄:

當日尚無紀錄

睡眠紀錄也是相同概念:

if (sleep.isHasRecord()) {
    sleepText = sleep.getTotalHours() + " 小時";
} else {
    sleepText = "當日尚無紀錄";
}

這樣就能避免把沒有資料的情況誤認成實際數值為零。


九、使用 Java Text Block 建立 Prompt

今天還使用了之前比較少接觸的 Java 語法:

"""
文字內容
"""

這個功能叫做:

Text Block。

它可以讓我們在 Java 裡面撰寫多行字串。

例如:

String prompt = """
    你是一位智慧健康紀錄整理助手。

    請根據提供的資料,
    產生一段繁體中文摘要。
    """;

如果使用傳統字串寫法,可能需要:

String prompt =
        "你是一位智慧健康紀錄整理助手。\n"
        + "請根據提供的資料,\n"
        + "產生一段繁體中文摘要。";

相比之下,Text Block 比較容易閱讀。

尤其是 Prompt 通常會包含很多行文字。

所以這個功能非常適合用來撰寫 AI 指令。


十、使用 formatted() 插入健康資料

在 Prompt 最後,我們使用:

.formatted(
    summary.getDate(),
    waterText,
    sleepText
);

這裡搭配了:

%s

例如:

String text = """
    日期:%s
    飲水紀錄:%s
    睡眠紀錄:%s
    """.formatted(
        "2026-10-17",
        "1500 ml",
        "7.5 小時"
    );

最後就會得到:

日期:2026-10-17
飲水紀錄:1500 ml
睡眠紀錄:7.5 小時

這樣我們就不需要手動把每個字串用 + 串接起來。

而且之後如果想修改 Prompt 的內容,也比較方便。


十一、今天的 Prompt 設計重點

還記得昨天提到的 Prompt 設計嗎?

我們希望 AI 可以:

整理紀錄

但不希望它:

自行編造健康資訊

所以今天的 Prompt 特別加入幾項規則。

1. 只能描述提供的資料

只能描述提供的健康紀錄。

避免 AI 自行補充使用者沒有提供的資訊。

2. 沒有紀錄不代表零

沒有紀錄不代表實際數值為零。

這點和 Day 20 的 hasRecord 設計有關。

3. 不提供醫療診斷

不提供疾病診斷或治療建議。

因為我們目前的系統只是健康紀錄整理工具。

並沒有足夠的資料或專業驗證,可以提供醫療診斷。

4. 限制回覆長度

產生一段 100 字以內的繁體中文摘要。

避免 AI 回傳過長的內容。

不過這只是 Prompt 中的要求,不能保證模型一定遵守。

如果未來需要嚴格限制文字長度,還需要在 Java 程式端進一步檢查。


十二、修改 AIController

Service 完成後,接下來要建立新的 API。

打開昨天的:

AIController.java

這次我們保留原本的:

GET /health/ai/test

再加入:

GET /health/ai/summary

完整程式如下:

package com.example.healthassistant.controller;

import com.example.healthassistant.dto.AIHealthSummaryResponse;
import com.example.healthassistant.service.AIService;
import com.example.healthassistant.service.AIHealthSummaryService;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.util.Map;

@RestController
@RequestMapping("/health/ai")
public class AIController {

    private final AIService aiService;
    private final AIHealthSummaryService aiHealthSummaryService;

    public AIController(
            AIService aiService,
            AIHealthSummaryService aiHealthSummaryService) {

        this.aiService = aiService;
        this.aiHealthSummaryService = aiHealthSummaryService;
    }

    @GetMapping("/test")
    public ResponseEntity<Map<String, String>> testAI() {

        String prompt =
                "請用一句繁體中文介紹智慧健康助理,"
                + "不要提供醫療診斷或治療建議。";

        String result = aiService.generateText(prompt);

        return ResponseEntity.ok(
                Map.of("message", result)
        );
    }

    @GetMapping("/summary")
    public ResponseEntity<AIHealthSummaryResponse> getAISummary(
            @RequestParam
            @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
            LocalDate date) {

        AIHealthSummaryResponse result =
                aiHealthSummaryService.generateDailySummary(date);

        return ResponseEntity.ok(result);
    }
}

這樣就完成今天的新 API!


十三、使用 Postman 測試 AI 健康摘要

接下來重新啟動 Spring Boot。

先確認:

  • H2 Database 已經正常啟動。
  • 資料庫中有飲水和睡眠紀錄。
  • API Key 已經正確設定。
  • OpenAI API 可以正常連線。

接著打開 Postman。

HTTP Method:

GET

URL:

http://localhost:8080/health/ai/summary?date=2026-10-17

按下:

Send

這時候系統會執行:

查詢 2026-10-17 的健康紀錄
             ↓
取得飲水量與睡眠時數
             ↓
建立 Prompt
             ↓
呼叫 OpenAI API
             ↓
取得 AI 文字
             ↓
回傳 JSON

假設當天有:

飲水紀錄:1500 ml
睡眠紀錄:7.5 小時

預期回傳類似:

{
  "date": "2026-10-17",
  "summary": "今天已記錄 1500 ml 的飲水量,以及 7.5 小時的睡眠時間。可以持續記錄每天的生活習慣,方便日後觀察不同日期的變化。"
}

這裡要特別注意:

以上只是預期回傳範例,實際文字會依照模型產生的結果而不同。

而且每次呼叫都可能產生 API 使用費用。

所以測試時不需要一直重複按 Send XD


十四、測試沒有飲水紀錄的情況

接下來測試另一種情況。

假設:

2026-10-16

只有睡眠紀錄:

6.5 小時

沒有飲水紀錄。

這時候系統建立的 Prompt 就會包含:

日期:2026-10-16

飲水紀錄:當日尚無紀錄
睡眠紀錄:6.5 小時

我們希望 AI 回傳類似:

{
  "date": "2026-10-16",
  "summary": "這一天已記錄 6.5 小時的睡眠時間,目前尚無飲水紀錄。可以持續補充每日紀錄,方便日後觀察生活習慣的變化。"
}

這樣就不會直接說:

你今天沒有喝水。

因為我們根本不知道使用者實際喝了多少水。

這也是為什麼前面要特別建立:

hasRecord

這個欄位。


十五、如果完全沒有健康紀錄呢?

再來考慮一個特殊情況。

如果使用者查詢的日期,完全沒有飲水和睡眠紀錄。

例如:

2026-10-10

資料庫裡沒有任何相關資料。

這時候 Prompt 會變成:

日期:2026-10-10

飲水紀錄:當日尚無紀錄
睡眠紀錄:當日尚無紀錄

AI 可能產生:

這一天尚未留下飲水與睡眠紀錄,因此目前無法整理相關數據。可以在日後補充紀錄,方便觀察生活習慣的變化。

這樣的回覆會比:

你今天喝水 0 ml,睡眠 0 小時。

更符合資料的實際意義。

不過如果未來要節省 API 使用量,其實可以直接在 Java 裡面判斷:

兩種紀錄都不存在

就回傳固定訊息,不必呼叫 AI。

這部分可以作為後續優化方向。


十六、AI 產生的摘要一定正確嗎?

這是今天需要特別注意的問題。

即使我們已經設計了 Prompt,AI 仍然可能產生不完全符合要求的內容。

例如原本提供:

飲水紀錄:1500 ml
睡眠紀錄:7.5 小時

但 AI 卻回覆:

你今天的睡眠品質非常好,
身體狀況也很健康。

這樣就超出我們提供的資料範圍。

因為單純知道睡眠時數,不能直接判斷睡眠品質。

同樣地,也不能只根據飲水量就判斷使用者的整體健康狀況。

所以目前的 AI 摘要功能,只應該用來:

  • 整理已提供的健康紀錄
  • 將數字轉換成容易閱讀的文字
  • 說明哪些項目尚無紀錄
  • 提醒使用者持續記錄

不應該直接提供疾病診斷或治療建議。

而且 Prompt 只能降低模型產生不適當內容的機率,不能完全保證結果正確。

如果未來要正式提供服務,仍然需要加入輸出檢查與更完整的安全機制。


十七、為什麼今天沒有讓 AI 直接查資料庫?

今天的架構是:

H2 Database
     ↓
HealthSummaryService
     ↓
AIHealthSummaryService
     ↓
建立 Prompt
     ↓
AIService
     ↓
OpenAI API

也就是先由 Java 查詢和整理資料,再將需要的資訊交給 AI。

我們沒有讓 AI 直接連接資料庫。

這樣有幾個好處。

1. 資料範圍比較容易控制

我們可以決定只提供:

日期
飲水量
睡眠時數

不需要把整個資料庫都交給 AI。

2. 數值計算由 Java 負責

例如飲水量加總:

getTotalWaterByDate()

以及睡眠時數加總:

getTotalHoursByDate()

都已經由 Java 完成。

AI 只需要整理文字,不必重新計算。

3. 比較容易保護隱私

未來如果加入姓名、帳號或其他個人資料,可以在 Java 程式端決定哪些欄位不應該傳送給 AI。

這樣比較符合資料最小化的原則。

不過如果未來真的要處理使用者健康資訊,仍然需要確認外部 AI 服務的資料處理政策與相關隱私要求。


十八、目前的 API 設計還有一個問題

今天我們使用:

GET /health/ai/summary

來產生 AI 摘要。

這樣在本機測試很方便。

但仔細想想,這個 API 其實會觸發外部 AI 呼叫。

也就是說:

每次請求都可能產生費用。

而 GET 通常用於讀取資源。

某些瀏覽器、快取或其他系統可能會預先讀取或重複發送 GET 請求。

所以如果未來要正式部署,將 AI 生成操作改成 POST 會更適合。

例如:

POST /health/ai/summary

Request Body:

{
  "date": "2026-10-17"
}

這樣就可以更清楚地表達:

這次請求會執行 AI 生成操作。

今天先沿用 GET,方便理解整合流程。

但正式系統還需要考慮:

使用者驗證
請求次數限制
API 使用費用
重複生成控制

這些問題。


十九、目前的專案結構

今天新增了:

AIHealthSummaryResponse.java
AIHealthSummaryService.java

並修改:

AIController.java

目前專案結構如下:

health-assistant
│
├── src/main/java/com/example/healthassistant
│   │
│   ├── HealthAssistantApplication.java
│   │
│   ├── controller
│   │   ├── HealthController.java
│   │   ├── WaterController.java
│   │   ├── SleepController.java
│   │   ├── HealthSummaryController.java
│   │   └── AIController.java
│   │
│   ├── service
│   │   ├── BmiService.java
│   │   ├── WaterService.java
│   │   ├── SleepService.java
│   │   ├── HealthSummaryService.java
│   │   ├── AIService.java
│   │   └── AIHealthSummaryService.java
│   │
│   ├── repository
│   │   ├── WaterRepository.java
│   │   └── SleepRepository.java
│   │
│   ├── dto
│   │   ├── HealthRequest.java
│   │   ├── WaterRequest.java
│   │   ├── WaterHistoryResponse.java
│   │   ├── WaterStatisticsResponse.java
│   │   ├── SleepRequest.java
│   │   ├── SleepResponse.java
│   │   ├── SleepHistoryResponse.java
│   │   ├── SleepStatisticsResponse.java
│   │   ├── WaterSummaryResponse.java
│   │   ├── SleepSummaryResponse.java
│   │   ├── HealthSummaryResponse.java
│   │   └── AIHealthSummaryResponse.java
│   │
│   └── exception
│       └── GlobalExceptionHandler.java
│
├── src/main/resources
│   ├── application.properties
│   └── schema.sql
│
└── pom.xml

現在智慧健康助理的 AI 功能已經不只是測試連線。

而是開始真正使用我們前面建立的健康紀錄。


二十、今天的功能還有哪些限制?

雖然今天完成 AI 健康摘要功能,但目前仍然有幾個需要改進的地方。

1. AI 摘要沒有儲存

目前每次呼叫 API,都會重新向 AI 模型發送請求。

如果同一天的健康資料沒有改變,其實不一定需要重新生成。

未來可以考慮將 AI 摘要保存起來。

2. 尚未加入輸出驗證

目前我們直接將 AI 產生的文字回傳給使用者。

但還沒有檢查摘要中的數字是否和原始資料一致。

這是未來需要補強的地方。

3. 尚未加入完整錯誤處理

如果外部 AI API 無法連線、回應逾時或額度不足,目前仍可能回傳一般伺服器錯誤。

未來可以加入更清楚的錯誤訊息。

4. 尚未加入使用者驗證

目前仍然是單人本機練習專案。

如果未來要提供多人使用,就需要加入帳號系統與權限控管。

5. 還沒有互動式聊天功能

目前 AI 只能根據指定日期產生摘要。

使用者還不能直接輸入問題,例如:

我最近一週的睡眠紀錄有什麼變化?

這也是後面可以繼續擴充的方向。


Day 23 小結

今天成功完成智慧健康助理的第一個 AI 健康紀錄整合功能!

現在系統不只可以儲存與查詢資料,也能將健康紀錄整理成 Prompt,交給生成式 AI 產生自然語言摘要。

今天完成的功能包括:

  1. 建立 AIHealthSummaryResponse DTO
  2. 建立 AIHealthSummaryService
  3. 整合 HealthSummaryService 與 AIService
  4. 將健康紀錄轉換成 Prompt
  5. 使用 hasRecord 判斷資料是否存在
  6. 使用 Java Text Block 撰寫多行 Prompt
  7. 使用 formatted() 插入健康資料
  8. 建立 AI 每日健康摘要 API
  9. 使用 Postman 測試整合功能

目前智慧健康助理的功能已經變成:

智慧健康助理
│
├── BMI 計算與分類
│
├── 飲水量紀錄
│   ├── 新增紀錄
│   ├── 歷史查詢
│   └── 七天統計
│
├── 睡眠時間紀錄
│   ├── 新增紀錄
│   ├── 指定日期查詢
│   └── 七天統計
│
├── 每日健康摘要
│   └── 整合飲水與睡眠資料
│
└── AI 功能
    ├── AI API 串接測試
    └── AI 每日健康文字摘要

今天最大的收穫是:

讓 AI 發揮作用的關鍵,不只是成功呼叫模型,而是先將資料整理成正確、清楚且有意義的輸入。

前面建立的 DTO、Service 和資料庫功能,現在終於可以和 AI 串接起來。

也讓我更清楚地理解,為什麼需要先花時間建立後端基礎。

因為只有資料整理得夠清楚,AI 才比較有機會產生符合需求的回覆。


明日預告

Day 24|讓 AI 回答健康問題!建立智慧健康問答 API

今天已經讓 AI 可以根據每日健康紀錄產生文字摘要。

但目前使用者還不能直接向智慧健康助理提問。

所以下一篇準備加入:

AI 健康問答功能!

預計會學習:

  • 如何建立使用者提問 DTO
  • 使用 POST API 接收問題
  • 如何設計健康問答 Prompt
  • 如何限制 AI 不提供醫療診斷
  • 如何處理空白或過長的問題
  • 如何將 AI 回覆轉換成 JSON
  • 使用 Postman 測試健康問答 API

讓智慧健康助理開始具備基本的互動式問答能力!


上一篇
Spring Boot 串接生成式 AI API
下一篇
用 Spring Boot 建立智慧健康問答 API
系列文
Java × AI:30天打造智慧健康助理 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言